<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script>
  
function Foo(){
    //this.getName=function(){console.log(6);}
    getName=function(){console.log(1)};
    
    return this;
}

Foo.getName=function(){console.log(2);};
Foo.prototype.getName=function(){console.log(3)};
var getName=function(){console.log(4);};
function getName(){console.log(5)};

getName();
Foo.getName();//console.log(2)
// console.log(Foo.getName);
getName();//console.log(4);
Foo().getName();//console.log(1);
getName();//console.log(1);因为上一行的代码把全局变量的getName修改了
console.log(new Foo());
new Foo.getName();//console.log(2);因为优先级别，先执行函数，再实例化 new (Foo.getName())，所以输出2
console.log("new Foo",new Foo,typeof(new Foo));
const a=new Foo;//实例a,无参实例化
new Foo().getName();//console.log(3);因为优先级别，先实例化，再用实例调用方法(new Foo()).getName())=>foo.getName()才能调用prototype的函数
console.log("new Foo()",new Foo(),typeof(new Foo()));
const b=new Foo();//实例b,有参实例化
console.log(a==b,a===b,a instanceof Foo,b instanceof Foo);
new new Foo().getName();  //console.log(3);


var a1="2";
var a1="32";
console.log(a1)
// function a1(){console.log("3")}
console.log(a);
//1.prototype的属性是给对象实例化后使用的，普通对象访问不了
//2.变量与函数同名，因为函数变量提升，先升到顶部，然后再给变量声明覆盖
//3.new Foo()有带参数列表（19级），new Foo无带参数列表。无带参数列表的优先级别是18低于成员访问优先级别19
    </script>
  </head>
  <body></body>
</html>

